﻿using System;
using System.Collections.Specialized;
using System.Text.RegularExpressions;

namespace AgileRollover.Utility
{
	/// <summary>
	/// Arguments class
    /// Code taken from http://www.codeproject.com/KB/recipes/command_line.aspx
    /// Authored by Richard Lopes - GriffonRL http://www.codeproject.com/Members/GriffonRL
    /// Used with MIT License
	/// </summary>

	public class ArgumentParser
	{
        
        #region GlobalVariables
		private StringDictionary Parameters;
        #endregion GlobalVariables


		public ArgumentParser(string[] Args)
		{
			Parameters = new StringDictionary();
			Regex Spliter = new Regex(@"^-{1,2}|^/|=|:",
				RegexOptions.IgnoreCase | RegexOptions.Compiled);

			Regex Remover = new Regex(@"^['""]?(.*?)['""]?$",
				RegexOptions.IgnoreCase | RegexOptions.Compiled);

			string Parameter = null;
			string[] Parts;

			// Valid parameters forms:
			// {-,/,--}param{ ,=,:}((",')value(",'))
			// Examples: 
			// -param1 value1 --param2 /param3:"Test-:-work" 
			//   /param4=happy -param5 '--=nice=--'

			foreach (string Txt in Args)
			{
				// Look for new parameters (-,/ or --) and a
				// possible enclosed value (=,:)

				Parts = Spliter.Split(Txt, 3);

				switch (Parts.Length)
				{
					// Found a value (for the last parameter 
					// found (space separator))

					case 1:
						if (Parameter != null)
						{
							if (!Parameters.ContainsKey(Parameter))
							{
								Parts[0] =
									Remover.Replace(Parts[0], "$1");

								Parameters.Add(Parameter, Parts[0]);
							}
							Parameter = null;
						}
						// else Error: no parameter waiting for a value (skipped)
						break;

					// Found just a parameter
					case 2:
						// The last parameter is still waiting. 
						// With no value, set it to true.
						if (Parameter != null)
						{
							if (!Parameters.ContainsKey(Parameter))
								Parameters.Add(Parameter, "true");
						}
						Parameter = Parts[1];
						break;

					// Parameter with enclosed value
					case 3:
						// The last parameter is still waiting. 
						// With no value, set it to true.
						if (Parameter != null)
						{
							if (!Parameters.ContainsKey(Parameter))
								Parameters.Add(Parameter, "true");
						}

						Parameter = Parts[1];
						// Remove possible enclosing characters (",')
						if (!Parameters.ContainsKey(Parameter))
						{
							Parts[2] = Remover.Replace(Parts[2], "$1");
							Parameters.Add(Parameter, Parts[2]);
						}

						Parameter = null;
						break;
				}
			}
			// In case a parameter is still waiting
			if (Parameter != null)
			{
				if (!Parameters.ContainsKey(Parameter))
					Parameters.Add(Parameter, "true");
			}
		}

		// Retrieve a parameter value if it exists 
		// (overriding C# indexer property)
		public string this[string Param]
		{
			get
			{
				return (Parameters[Param]);
			}
		}

        public int count()
        {
            return Parameters.Count;
        }

        public Boolean hasParameters()
        {
            if (this.count() > 0)
                return true;
            else
                return false;
        }

        public string getArg(string key)
        {
            if (Parameters[key] != null)
            {
                return Parameters[key];
            }
            else
            {
                return null;
            }
        }
	}
}
